package com.xyz.graph.common;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.Map;

public abstract class BaseController {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 成功返回信息
     *
     * @return 返回消息对象
     */
    protected CommonResponse success() {
        return success((String) null);
    }

    /**
     * 成功返回信息
     *
     * @param message
     * @return 返回消息对象
     */
    protected CommonResponse success(String message) {
        return success(message, null);
    }

    /**
     * 返回成功数据
     *
     * @param data 待返回的数据
     * @return 返回消息对象
     */
    protected CommonResponse success(Object data) {
        return success((String) null, data);
    }

    /**
     * 返回成功数据
     *
     * @param message 返回信息
     * @param data    待返回的数据
     * @return 返回消息对象
     */
    protected CommonResponse success(String message, Object data) {
        return result(ErrorCode.SUCCESS, message, data, null);
    }


    /**
     * 返回错误信息
     *
     * @param code    错误码
     * @param message 消息提示参数
     * @return 返回消息对象
     */
    protected CommonResponse error(int code, String message) {
        return result(code, message, null, null);
    }

    /**
     * 返回错误信息
     *
     * @param code   错误码
     * @param params 消息提示参数
     * @return 返回消息对象
     */
    protected CommonResponse error(int code, Object[] params) {
        return error(code, null, params);
    }

    /**
     * 返回错误信息
     *
     * @param code   错误码
     * @param format 消息提示的模板
     * @param params 消息提示参数
     * @return 返回消息对象
     */
    protected CommonResponse error(int code, String format, Object[] params) {
        return result(code, format, null, params);
    }

    /**
     * 返回错误信息
     *
     * @param code   错误码
     * @param format 消息提示的模板
     * @param data   返回的数据
     * @param params 消息提示参数
     * @return 返回消息对象
     */
    protected CommonResponse error(int code, String format, Object data, Object[] params) {
        return result(code, format, data, params);
    }

    /**
     * dirName  只有下载文件到本地的时候才有用
     *
     * @param response
     * @param filePath 文件路径
     */
    protected boolean download(HttpServletResponse response, String filePath) {
        File file = new File(filePath);
        response.setHeader("Content-Disposition", "attachment;filename=" + file.getPath());
        response.setContentLength((int) file.length());
        InputStream is = null;
        OutputStream out = null;
        byte[] bytes = new byte[2048];
        int count = 0;
        try {
            out = response.getOutputStream();
            is = new FileInputStream(file);
            while ((count = is.read(bytes)) > 0) {
                out.write(bytes, 0, count);
            }
            return true;
        } catch (IOException e) {
            logger.error("download file error: {}", file.getAbsolutePath(), e);
            return false;
        } finally {
            try {

                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                //
            }

        }
    }

    /**
     * 通用错误返回详细构造方法
     *
     * @param code    返回Code
     * @param message 返回消息
     * @param data    返回的数据
     * @param params  拼接消息参数
     * @return
     */
    private CommonResponse result(int code, String message, Object data, Object[] params) {
        CommonResponse response = new CommonResponse();
        response.setCode(code);
        response.setMessage(message);
        if (data != null) {
            response.setData(data);
        }
        if (params != null && params.length > 0) {
            response.setParams(params);
        }
        return response;
    }

    /**
     * 检索参数校验
     *
     * @param params 检索参数map
     * @return Page
     */
    protected CommonResponse paramsValidate(Map<String, Object> params, List<String> fieldsList) {
        if (params == null || params.isEmpty()) {
            return error(ErrorCode.PARAM_REQUEST_ERROR, "参数map(params)不能为空");
        }
        for (String field : fieldsList) {
            if (!params.containsKey(field)) {
                return error(ErrorCode.PARAM_REQUEST_ERROR, field + "不能为空");
            }
        }
        return null;
    }

    /**
     * 导出参数校验
     *
     * @param params 检索参数map
     * @return Page
     */
    protected CommonResponse paramsValidateExport(Map<String, Object> params, List<String> fieldsList) {
        if (params == null || params.isEmpty()) {
            return error(ErrorCode.PARAM_REQUEST_ERROR, "参数map(params)不能为空");
        }
        for (String field : fieldsList) {
            if (field.equals("pageSize") || field.equals("pageNo")) {
                continue;
            }
            if (!params.containsKey(field)) {
                return error(ErrorCode.PARAM_REQUEST_ERROR, field + "不能为空");
            }
        }
        return null;
    }

}
